from django import forms
from web.forms.bootstrap import BootStrapForm
from web import models
from django.core.exceptions import ValidationError
from utils.tecent.cos import check_file
from qcloud_cos.cos_exception import CosServiceError
class FolderModelForm(BootStrapForm, forms.ModelForm):
    class Meta:
        model = models.File
        fields = ['name']

    def __init__(self, request, parent_object, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.request = request
        self.parent_object = parent_object
        '''在queryset加上.first()即为File对象
        特性         	         QuerySet	                   模型实例（如File对象）
    是否惰性执行	            是，直到需要数据时才执行数据库查询	   不是，已经执行了数据库查询
    是否支持链式调用	        是，可以逐步完善查询条件	           不支持，已经是一个具体对象
    是否支持.filter()等方法	是，可以继续添加查询条件	           不支持，会报AttributeError
    是否包含多条数据	        是，表示一个数据集合	           不是，表示一条具体的数据
    是否可以访问属性	        不可以，需要通过.values()或循环访问	可以，通过点号（.）访问属性'''
    #数据库下判断当前目录下该文件夹是否存在
    def clean_name(self):
        name = self.cleaned_data['name']
        queryset = models.File.objects.filter(file_type=2, name=name, project=self.request.tracer.project)
        if self.parent_object:
            exists=queryset.filter(parent=self.parent_object).exists()
        else:
            exists = queryset.filter(parent__isnull=True).exists()
        if exists:
            raise ValidationError('该文件夹已存在')
        return name

class FileModelForm(forms.ModelForm):
    etag=forms.CharField(label='Etag')
    class Meta:
        model = models.File
        exclude = ['project','file_type','update_user','update_time']

    def __init__(self,request, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.request = request

    def clean_file_path(self):
        return "https://{}".format(self.cleaned_data['file_path'])

    def clean(self):
        key = self.cleaned_data.get('key')
        etag = self.cleaned_data.get('etag')
        size = self.cleaned_data.get('file_size')

        if not key or not etag:
            return self.cleaned_data

        # 调用 check_file 函数并获取返回值
        try:
            result = check_file(self.request.tracer.project.bucket, self.request.tracer.project.region, key)
        except CosServiceError as e:
            self.add_error("key", '文件不存在')
            return self.cleaned_data

        cos_etag = result.get('ETag')
        if etag != cos_etag:
            self.add_error('etag', 'ETag错误')

        cos_length = result.get('Content-Length')
        if int(cos_length) != size:
            self.add_error('size', '文件大小错误')

        return self.cleaned_data
